package com.xiangge.number;

/**
 * @author xiangge
 * @version 1.0
 * @date 2025/4/14 10:59
 * @description   自动装箱和拆箱
 *      自动装箱： 将基本数据类型自动转换为对应的包装类对象
 *          说明： 自动装箱的底层代码就是 Integer.valueOf(20)
 *      自动拆箱： 将包装类对象自动转换为对应的基本数据类型
 *          说明：自动拆箱的底层代码就是 intValue()
 *
 *      自动装箱过程中的缓存问题：
 *          当Integer类加载时会加载内部类： IntegerCache , 内部类中提供一个长度为：256的Integer[] cache,  会自动的将value值为 [-128,127]之间的Integer对象存入到
 *            cache对象数组的对应[0,255]位置,当自动装箱时，如果装箱的value值在[-128,127]之间,那么会直接从数组cache中指定位置获取对象,装箱的值相同获取到的对象为同一个对象
 *            装箱的值超过[-128,127]之间，那么每次自动装箱都会重新new一个新的对象
 *
 */
public class NumberDemo4 {
    public static void main(String[] args) {
        Integer num1 = 127;
        Integer num2 = 127;
        System.out.println(num1 == num2);// true

        Integer num3 = 128;
        Integer num4 = 128;
        System.out.println(num3 == num4);// false
        /*
            public static Integer valueOf(int i) {
                if (i >= IntegerCache.low && i <= IntegerCache.high)   //  i >= -128 && i <= 127
                    return IntegerCache.cache[i + (-IntegerCache.low)];    // i + (-IntegerCache.low) = 255
                return new Integer(i);
            }

             private static class IntegerCache {
                static final int low = -128;
                static final int high;
                static final Integer cache[];

                static {
                    int h = 127;
                    high = h;

                    cache = new Integer[(high - low) + 1]; // 创建一个数组，数组的长度为high-low+1 = 256
                    int j = low;
                    for(int k = 0; k < cache.length; k++)
                        cache[k] = new Integer(j++);

                        第 1 轮：k = 0 ,  cache[0] = new Integer(-128);     j = -127
                        第 2 轮：k = 1 ,  cache[1] = new Integer(-127);     j = -126
                        ...
                        第 3 轮：k = 1 ,  cache[128] = new Integer(0);     j = -126
                        ...
                        第 256 轮： cache[255] = new Integer(127);     j = 128
            }
         */
    }
    public static void main1(String[] args) {
        int num = 10;
        // 自动装箱：Integer类中的静态方法valueOf()
        Integer num2 = num;
        Integer num3 = Integer.valueOf(20);
        // 自动拆箱：
        Integer num4 = new Integer(30);
        int num5 = num4;
        int num6 = num4.intValue();

    }
}
